Skip to content

fix(service-messaging,mcp): the inbox list hides the raw topic; an MCP argument refusal ends at the fix - #30688

Merged
objectstack-fleet[bot] merged 4 commits into
mainfrom
claude/project-thread-nhel89
Nov 5, 2026
Merged

objectstack-fleet[bot] merged 4 commits into
mainfrom
claude/project-thread-nhel89

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Requested by Elon · project thread

domain:server#4 · os-elon-musk · session_016WV4cxrNurGFU9PsE6NwNT

Part of #30126 (rows 8 and 15 land here; rows 9, 12, 13 and 16 stay on the card, see Acceptance notes)

Clause-②: no
Metadata-protocol: none

维护者速读

  • 改了什么:收件箱「我的通知」列表不再显示 notify 这类原始主题 id(只剩标题、级别、时间);MCP 工具收到没声明的参数时,报错只说错在哪、该怎么写,不再追加一句给内部开发者看的历史说明。
  • 为什么改:真实用户走查里,通知列表的 Topic 列读成 notify,读者看不懂;MCP 报错末尾「This argument used to be dropped silently…」对调用方没有用,只是噪音。
  • 风险与回滚:很小。topic 字段本身没动,仍可搜索、可被其他视图使用;MCP 照旧拒收每个未声明参数,只是少了最后一句。回滚即撤本 PR。
  • 先看:packages/mcp/src/mcp-http-tools.ts 的 withoutHistorySentence 与 strictToolInput;packages/services/service-messaging/src/objects/inbox-message.object.ts 的 mine 视图 columns。
  • 两分钟验证:pnpm --filter @objectstack/mcp exec vitest run src/mcp-http-tools.unknown-argument-keys.test.ts,预期 13 条全绿;另有 pnpm --filter @objectstack/service-messaging exec vitest run src/objects/inbox-message-mine-view.test.ts 2 条全绿。
  • 需要你做的:无,席位落地(非受管面)。行 9、13、16 的取舍另由席位呈决裁。

What changes

  • Row 8, @objectstack/service-messaging. sys_inbox_message's mine list view (a person's own notifications) projected ['title', 'topic', 'severity', 'created_at']. topic is the producer's machine id (notify from a flow's notify node, collab.mention from a mention) and no catalog labels it, so the column read notify. The view now projects ['title', 'severity', 'created_at']. The card's suggestion was "hide it or give it a label"; there is nothing to label it from, so it is hidden. The topic field is unchanged and still searchable.
  • Row 15, @objectstack/mcp. Every MCP tool closes its argument shape with strictUnknownKeyError (@objectstack/spec/shared), which ends each message with the surface's history sentence. The MCP tools passed UNKNOWN_ARG_HISTORY ("This argument used to be dropped silently and the call still succeeded, …"). They now pass an empty history through a small wrapper, withoutHistorySentence, which trims the separator the factory leaves, so the message ends at its last fix channel. The explanation of the posture stays in the file's comments. packages/spec is not touched: the factory is unchanged for every authorable schema.

Tests

  • packages/services/service-messaging/src/objects/inbox-message-mine-view.test.ts (new, 2): the mine view's columns are exactly title, severity, time; topic stays a searchable field.
  • packages/mcp/src/mcp-http-tools.unknown-argument-keys.test.ts (new top-level describe in the existing harness, 2): the reported sort call is refused with `sort` → `orderBy` and no history sentence; over every advertised tool, no refusal carries the sentence or ends in whitespace.
  • Ablations through scripts/ablation-replace.mjs, each restored with git diff HEAD empty: the old history sentence put back → 2 failed of 13 in the MCP file; topic put back in the view → 1 failed of 2. Both test files import src.
  • @objectstack/mcp full suite: 56 files, 680 passed. @objectstack/service-messaging full suite: 67 files, 847 passed. typecheck for both: exit 0.

Acceptance notes

Verification

Derived gates and suites
  • node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack at 18552efc (5 paths vs merge base b77c160a): 63 commands, each run with its exit code captured before any pipe. 60 exit 0 on the first pass; three exit 3 (prerequisite):
    • node scripts/check-plugin-teardown-shape.mjs --self-test: exit 0 after fetching its pinned fixture commit 621a4876 (48 cases).
    • pnpm check:i18n: exit 0 after its own named prerequisite build (CLI + the ten extract packages): "all bundles in sync, no undeclared authoring keys".
    • pnpm check:dual-build-cjs-loads: NOT MEASURED locally (needs a whole-workspace build); CI's Lint & Repo Gates runs it.
  • dispatch-gates --ran: 63 derived, 62 run, 1 NOT-MEASURED (the one above), 0 UNRUN, exit 0. Changed lines: 126 (+107 / -19, 5 files).
  • pnpm --filter @objectstack/mcp typecheck, pnpm --filter @objectstack/service-messaging typecheck: exit 0 (after a full build of both closures).
  • Suites: @objectstack/mcp 56 files / 680 tests passed; @objectstack/service-messaging 67 files / 847 tests passed.
  • Merged origin/main (a2437b56) before opening; the incoming commits touch neither package, so nothing was re-run. Final head 3a5b38d6. CI check-runs: not read at the time of writing.

Generated by Claude Code

@github-actions github-actions Bot added size/m documentation Improvements or additions to documentation tests tooling Fix lands in tooling, not a product package — enters pm:queue only with Unblocks: or a named surface labels Nov 5, 2026
@github-actions

github-actions Bot commented Nov 5, 2026

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

This PR changes 2 package(s): @objectstack/mcp, @objectstack/service-messaging, touching 4 documentable anchor(s).

16 hand-written doc(s) name something this change touched — list omitted above 15 rows. Re-derive on the tree named below: node scripts/docs-audit/affected-docs.mjs --json a2437b560bd8872feece6ec8b57c6fdf21cff1f4.

⛔ 2 release-owned page(s) also affected — read-only, see AGENTS.md Documentation Guardrails.

What this run could not see
  • 1 anchor(s) matched too much of the corpus to be a work list: created_at (literal, 43 pages)
  • the SDK route bridge reached 63 of 221 client-bound route-ledger rows — the other 158 have no registrar path: tail to select them, so pages documenting THEIR client methods cannot appear above, on this or any run. Of those 158: 0 are remediable by widening that discovery convention (an in-repo file declares the path; the convention did not scan it); 55 are structural — on a ledger where NOT ONE row is declared in-repo, so no discovery change reaches them at any price; 103 are undecided (no in-repo declaration, on a ledger that has other in-repo registrars — absence and an unreadable spelling are not distinguishable here). The rows themselves: node scripts/docs-audit/affected-docs.mjs --bridge-coverage
  • a page that states a rule by its inputs shares no identifier with the emitter that implements the rule, so an emitter-only diff cannot list it — not on this run and not on any run. Measured on fix(driver-sql): emit varchar(maxLength) for a text field a declared index keys on #11430: content/docs/protocol/objectql/types.mdx documents the text-family column mapping by the ObjectQL type names it maps FROM (text / textarea / html) while the diff changed createColumn; it went unlisted, and it was the page that diff falsified, in four places. No shared token exists to detect this on, so a rule your change carries has to be re-read by hand in the pages that restate it.
  • a key NAME is not a key, so the hand re-read the line above prescribes can land on the wrong schema. The same spelling is authorable on one governed type and a [REMOVED] tombstone on another for each of active, aria, joins, objects, template, tools and version (censused on [finding] tools is a key on BOTH AgentSchema (tombstoned, dead) and SkillSchema (live, cloud-attested), so a name-based search attributes skill examples to the agent key — it produced a false stop-the-line alarm on PR #19059 #19093 over the liveness ledger's governed types, top-level keys); nothing in a search result distinguishes the two, so a grep hit on a LIVE example reads as evidence about the DEAD key. Measured on fix(spec): the agent.tools liveness row says dead — it claimed live on a key the schema tombstoned #19059: content/docs/ai/agents.mdx was reported as contradicting the agent.tools tombstone over its tools: example at :161, which is inside the defineSkill({ block opened at :155 — the page was already correct. Settle ownership by PARSING the value against both schemas, never by the name: that literal PASSES SkillSchema, and as an AgentSchema it FAILS at tools with the tombstone prescription. ⛔ These names are not the whole class — a key retired through a .strict() guidance map leaves no tombstone in the walked shape and none of them here (tool.category, live as AIToolDefinition.category).

Coarse fallback — 15 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): node scripts/docs-audit/affected-docs.mjs --json a2437b560bd8872feece6ec8b57c6fdf21cff1f4 → packageMentionDocs.

Which tree this was computed on

This run read content/docs from 7a52005dbf0a32cd7bbfe0757a31b7fa25636201 — the merge of head 3a5b38d6a0dfa3a9bf51148abe2e3cc13d950288 into base a2437b560bd8872feece6ec8b57c6fdf21cff1f4, which is what actions/checkout gives a pull_request run. Not the PR head.

A worktree cut from an older main holds a different content/docs, so re-deriving there can legitimately return a different list — that is a different tree, not a wrong row. To answer on the same tree:

# while this PR is open — GitHub drops the merge commit once it closes
git fetch origin 7a52005dbf0a32cd7bbfe0757a31b7fa25636201 && git checkout 7a52005dbf0a32cd7bbfe0757a31b7fa25636201
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin a2437b560bd8872feece6ec8b57c6fdf21cff1f4 3a5b38d6a0dfa3a9bf51148abe2e3cc13d950288 && git checkout -B drift-repro a2437b560bd8872feece6ec8b57c6fdf21cff1f4 && git merge --no-ff 3a5b38d6a0dfa3a9bf51148abe2e3cc13d950288

node scripts/docs-audit/affected-docs.mjs --json a2437b560bd8872feece6ec8b57c6fdf21cff1f4

⚠️ That checkout carried uncommitted changes, so the commit above does not fully identify what was read.

Advisory only, and a precision-first one (#9192): a page is listed because it names a
symbol, wire route or SDK method this diff touched — not because it mentions a changed
package. Each row says which anchor put it there, so a wrong row is reportable rather than
merely annoying. To re-verify, run the docs-accuracy-audit workflow scoped to these files:
node scripts/docs-audit/affected-docs.mjs a2437b560bd8872feece6ec8b57c6fdf21cff1f4 → pass the list as
args.docs, on the commit named under Which tree this was computed on.

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:server#4 · os-elon-musk · session_016WV4czvZykUqhYxYXSSDt4

维护者速读

  1. 改了什么:个人通知列表(sys_inbox_message 的 mine 视图)不再显示原始主题列(如 notify);MCP 工具参数报错只说该改成什么,去掉了写给内部开发看的历史说明。
  2. 为什么改:真实用户走查第 8、15 行:主题列是机器 id,看不懂;历史那句对调用方没用。
  3. 风险:低。topic 字段仍在对象上,可搜索可过滤;MCP 对未声明参数照旧拒绝,只少了结尾一句。
  4. 先看:packages/mcp/src/mcp-http-tools.ts 的 withoutHistorySentence,和 inbox-message.object.ts 的 columns。
  5. 两分钟验证:pnpm --filter @objectstack/mcp exec vitest run mcp-http-tools.unknown-argument-keys。
  6. 需要你做的:无,席位落地。第 9、13、16 行等你在席位线程裁定;第 12 行等 PR fix(objectql,rest)!: serve an object an extension renames without the base's plural (#30391) #30459 合并后再做。

席位意见:ACCEPT(#30126 第 8、15 行,Part of)。

席位核对

Head-sha: 3a5b38d6a0dfa3a9bf51148abe2e3cc13d950288 · read 2026-11-05T22:53Z

Item Reading
Shape Draft → main via relay pr_create; Part of #30126 (rows 8, 15). 5 files, +107/−19. ⛔ ui/**, packages/spec/** untouched.
Seat diff read Row 8: the mine view's columns drop topic (field kept on the object). Row 15: UNKNOWN_ARG_HISTORY removed; strictUnknownKeyError gets an empty history and withoutHistorySentence trims the trailing separator, so every tool's refusal ends at its fix. Refusal of an undeclared key unchanged.
Evidence New pins: the mine view's columns; the refusal names sort → orderBy and no history sentence; every advertised tool's refusal has no history sentence and no trailing whitespace. mcp 680/680, service-messaging 847/847, both typecheck 0 (os-dev-report 6671216554).
Gates (check-runs on this head) 48: 35 success, 13 skipped, 0 failed; mergeable_state clean.
Out of this PR Row 12: serial after PR #30459 (meta-item-read-gate.ts). Rows 9, 13, 16: needs_decision, analysis 6671252245, put to the maintainer. Row 16 also leaves the claimed surface (packages/runtime).
Semver @objectstack/service-messaging: patch, @objectstack/mcp: patch, Clause-②: no, Metadata-protocol: none.
Landing Not governed (check-governed-merges --pr 30688: 0 of 5 paths), 126 lines ≤ 3000, not BREAKING, so per pm-dispatch the seat lands it: pr_ready + automerge_enable. At merge the card goes to needs-user-decision for rows 9, 13, 16, with row 12 named.

@objectstack-fleet
objectstack-fleet Bot marked this pull request as ready for review November 5, 2026 22:54
@objectstack-fleet
objectstack-fleet Bot added this pull request to the merge queue Nov 5, 2026
Any commits made after this event will not be merged.
Merged via the queue into main with commit 06cccd3 Nov 5, 2026
49 checks passed
@objectstack-fleet
objectstack-fleet Bot deleted the claude/project-thread-nhel89 branch November 5, 2026 23:14
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation size/m tests tooling Fix lands in tooling, not a product package — enters pm:queue only with Unblocks: or a named surface

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant